/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"EB2DFB19-950B-4AEE-98F5-901F2D51E6AF",variableType:8}
 */
var fImpMin = 0;

/**
 * @properties={typeid:24,uuid:"4B8FA5C3-7C1B-4F88-A214-3A8B02B64BD2"}
 */
function resumenCuentaDs(clienteDesde, clienteHasta, modo) {
	globals.gtotal_saldo = 0
	if (clienteHasta == null)
		clienteHasta = clienteDesde
		
	var q_ant = 'SELECT cli.cliente_id,SUM(importe_signo) as "saldo_ant",cli.razon_social FROM ctacte_cl as "cc" '+
				'join clientes as "cli" on cc.cliente_id = cli.cliente_id '+ 
				'where upper(cli.razon_social) between upper(?) and upper (?) '+
				'and cc.fecha_mov < ? AND cc.userv_id = ?'+
				'group by cli.cliente_id,cli.razon_social order by cli.cliente_id'
	globals.gFechaDesde.setHours(00)
	globals.gFechaDesde.setMinutes(00)
	globals.gFechaDesde.setSeconds(00)
	globals.gFechaDesde.setMilliseconds(000)
	
	var fecha_desde = globals.gFechaDesde//utils.dateFormat(globals.gFechaDesde,'yyyy-MM-dd HH:mm:ss.SSS')
	var args 		= new Array(clienteDesde,clienteHasta,globals.gFechaDesde, globals.gUservID)
	var dataSource  = controller.getDataSource();
	var serverName  = databaseManager.getDataSourceServerName(dataSource)
	var $saldos_ant = databaseManager.getDataSetByQuery(serverName,q_ant,args,-1)
	
	var q_movim = "SELECT DISTINCT cc.cliente_id,cc.ctacte_cl_id,cli.razon_social,cc.fecha_mov,cc.cod_mov,cc.comprob_completo "+
		',cc.importe_signo, tb.descripcion as "comprobante" FROM ctacte_cl as "cc" JOIN clientes as "cli" ON cc.cliente_id = cli.cliente_id '+
		'INNER JOIN tab_mov_cl "tb" ON tb.cod_mov = cc.cod_mov '+
		'WHERE upper(cli.razon_social) between upper(?) and upper (?) and cc.fecha_mov BETWEEN ? AND ? AND cc.userv_id = ?'+
		'ORDER BY cc.cliente_id, cc.fecha_mov, cc.ctacte_cl_id '
	var fecha_hasta = globals.gFechaHasta
	fecha_hasta.setHours(23)
	fecha_hasta.setMinutes(59)
	fecha_hasta.setSeconds(59)
	fecha_hasta.setMilliseconds(996)
	//fecha_hasta 	= utils.dateFormat(fecha_hasta,'yyyy-MM-dd HH:mm:ss.SSS')
	args 			= new Array(clienteDesde,clienteHasta,fecha_desde,fecha_hasta, globals.gUservID)
	var $ds_movim 	= databaseManager.getDataSetByQuery(serverName,q_movim,args,-1)


	//Agrego columnas de credito, debito y saldo
	$ds_movim.addColumn('debito')
	$ds_movim.addColumn('credito')
	$ds_movim.addColumn('saldo_aux')
	$ds_movim.addColumn('saldo_final')
	$ds_movim.addColumn('mensaje')
	
	var idxImporte	= $ds_movim.getColumnNames().indexOf("importe_signo",0)+1
	var idxDebito 	= $ds_movim.getColumnNames().indexOf("debito",0)+1
	var idxCredito 	= $ds_movim.getColumnNames().indexOf("credito",0)+1
	var idxSaldo 	= $ds_movim.getColumnNames().indexOf("saldo_aux",0)+1
	var idxFinal 	= $ds_movim.getColumnNames().indexOf("saldo_final",0)+1
	var idxMensaje 	= $ds_movim.getColumnNames().indexOf("mensaje",0)+1
	
	var $fecha		= new Date(globals.gFechaDesde.getFullYear(),globals.gFechaDesde.getMonth(),globals.gFechaDesde.getDate()-1)

	//Recorrida calculando el saldo, debito y credito segun corresponda	
	if ($ds_movim.getMaxRowIndex() > 0)
	{
		var $cli_ant 	= $ds_movim.getValue(1,1)
		var $saldo_ant 	= buscarSaldo($saldos_ant,$cli_ant)
		var reg 		= new Array($cli_ant,0,$ds_movim.getValue(1,3),$fecha,null,'Saldo Anterior',null,null,null,null,$saldo_ant)
		$ds_movim.addRow(1,reg)
		var $cant_m 	= $ds_movim.getMaxRowIndex()
		//Para grabar el saldo final en la primera posicion del cliente
		var $pp			= 1
		
		for (var i = 2 ; i <= $cant_m ; i++)
		{
			if ($cli_ant != $ds_movim.getValue(i,1))
			{
				//Si el saldo del cliente es menor al minimo, lo borro del dataset
				if (Math.abs($saldo_ant) < fImpMin)
				{
					$ds_movim 	= borrarCliente($ds_movim,$cli_ant,i-1)
					i -= ($cant_m - $ds_movim.getMaxRowIndex())
					$cant_m 	= $ds_movim.getMaxRowIndex()
				}
				$ds_movim.setValue($pp,idxFinal,$saldo_ant)
				globals.gtotal_saldo += $saldo_ant
				var $saldoH = saldoHistorico(serverName,$ds_movim.getValue($pp,1),fecha_hasta).toFixed(2) * 1
				var difSaldos = $saldo_ant - $saldoH
				if (Math.abs(difSaldos) > 0.005)
					$ds_movim.setValue($pp,idxMensaje,'Diferencia de Saldos: '+ utils.numberFormat(difSaldos,'###,##0.00') + ' Histórico: ' + utils.numberFormat($saldoH,'###,##0.00'))

				
				$pp 		= i
				//Busco el saldo anterior en el otro dataset
				$cli_ant 	= $ds_movim.getValue(i,1)
				$saldo_ant 	= buscarSaldo($saldos_ant,$cli_ant)
				reg 		= new Array($cli_ant,0,$ds_movim.getValue(i,3),$fecha,null,'Saldo Anterior',null,null,null,null,$saldo_ant)
				$ds_movim.addRow(i,reg)
				$cant_m++
			}
			var $imp = null
			if ($ds_movim.getValue(i,idxImporte) != null)
				$imp = $ds_movim.getValue(i,idxImporte).toFixed(2) * 1
			//Calculo saldo, se suma el importe antes de grabar
			$saldo_ant += $imp
			$ds_movim.setValue(i,idxSaldo,$saldo_ant)
			//Si importe_signo < 0 va al credito
			if ($imp < 0)
			{
				$ds_movim.setValue(i,idxCredito,$imp*(-1))
				$ds_movim.setValue(i,idxDebito,null)
			}
			else
			{
				$ds_movim.setValue(i,idxDebito,$imp)
				$ds_movim.setValue(i,idxCredito,null)
			}
		}
		$ds_movim.setValue($pp,idxFinal,$saldo_ant)
		globals.gtotal_saldo += $saldo_ant
	}
	
	agregarSinMovim($ds_movim,$fecha, $saldos_ant)
	crearForm($ds_movim, 'resumen_gral_cuenta_imp', 'cuenta')
	/*var $params = {
		userv: uservs_to_uservs.razon_social,
		pTitulo: 'Resumen de Cuenta Desde '+ utils.dateFormat(globals.gFechaDesde,'dd-MM-yyyy') + ' Hasta '+ utils.dateFormat(globals.gFechaHasta,'dd-MM-yyyy'),
		pSaldoTotal: globals.gtotal_saldo
	}
	globals.metodoJasper('impresion','ventas/resumen_gral.jasper','Resumen_cuenta_clientes',$ds_movim,$params)*/
}

/**
 * @properties={typeid:24,uuid:"50B88EA3-EB67-4FB4-8DCA-2AC34C6E4D87"}
 */
function agregarSinMovim($ds_movim,$fecha,$saldos)
{
	var $cant = $saldos.getMaxRowIndex()
	for (var i = 1 ; i <= $cant ; i++)
	{
		var $saldo_ant = $saldos.getValue(i,2)
		if (Math.abs($saldo_ant) >= fImpMin)
		{
			var reg	= new Array($saldos.getValue(i,1),0,$saldos.getValue(i,3),$fecha,null,'Saldo Anterior',null,null,null,null,$saldo_ant,$saldo_ant)
			$ds_movim.addRow(reg)
			globals.gtotal_saldo += $saldo_ant
		}
	}
}

/**
 * @properties={typeid:24,uuid:"AC6AF6CF-B314-41E6-99A4-0AEA58DB8E25"}
 */
function buscarSaldo (saldos,cliente)
{
	var $cant 	= saldos.getMaxRowIndex()
	var i 		= 1
	while (i <= $cant && saldos.getValue(i,1) < cliente)
		i++
	
	if (i <= $cant && saldos.getValue(i,1) == cliente)
	{
		var valor = saldos.getValue(i,2)
		//lo elimino para proximas recorridas
		saldos.removeRow(i)
		return valor
	}
	return 0
}

/**
 * @properties={typeid:24,uuid:"0A24A3D6-9CC2-49F0-8871-29E69B6E52D2"}
 */
function borrarCliente(movim,cliente,pos)
{
	while (pos >= 1 && movim.getValue(pos,1) == cliente)
	{
		movim.removeRow(pos)
		pos--
	}
	return movim
}

/**
 * @properties={typeid:24,uuid:"D6295564-CDC3-47F8-83DC-750EC0B7CFDA"}
 */
function resumenSaldosDs(clienteDesde, clienteHasta, modo)
{
	globals.gtotal_saldo = 0
	if (clienteHasta == null)
		clienteHasta = clienteDesde
		
	var q_movim = "SELECT DISTINCT cc.cliente_id,cc.ctacte_cl_id,cli.razon_social,cc.fecha_mov,cc.cod_mov,cc.comprob_completo "+
		',cc.saldo_signo, tb.descripcion as "comprobante" FROM ctacte_cl as "cc" JOIN clientes as "cli" ON cc.cliente_id = cli.cliente_id '+
		'INNER JOIN tab_mov_cl "tb" ON tb.cod_mov = cc.cod_mov '+
		'WHERE cli.razon_social between upper(?) and upper (?) and cc.fecha_mov <= ? and cc.saldo > 0 AND cc.userv_id = ? '+ 
		'ORDER BY cc.cliente_id, cc.fecha_mov, cc.ctacte_cl_id'
	
	var fecha_hasta = globals.gFechaHasta
	fecha_hasta.setHours(23)
	fecha_hasta.setMinutes(59)
	fecha_hasta.setSeconds(59)
	fecha_hasta.setMilliseconds(996)
	//fecha_hasta 	= utils.dateFormat(fecha_hasta,'yyyy-MM-dd HH:mm:ss.SSS')
	var dataSource  = controller.getDataSource();
	var serverName  = databaseManager.getDataSourceServerName(dataSource)
	var args		= new Array(clienteDesde,clienteHasta,fecha_hasta, globals.gUservID)
	var $ds_movim 	= databaseManager.getDataSetByQuery('infocom',q_movim,args,-1)

	//Agrego columnas de credito, debito y saldo
	$ds_movim.addColumn('debito')
	$ds_movim.addColumn('credito')
	$ds_movim.addColumn('saldo_aux')
	$ds_movim.addColumn('saldo_final')
	$ds_movim.addColumn('mensaje')
	
	var idxImporte	= $ds_movim.getColumnNames().indexOf("saldo_signo",0)+1
	var idxDebito 	= $ds_movim.getColumnNames().indexOf("debito",0)+1
	var idxCredito 	= $ds_movim.getColumnNames().indexOf("credito",0)+1
	var idxSaldo 	= $ds_movim.getColumnNames().indexOf("saldo_aux",0)+1
	var idxFinal 	= $ds_movim.getColumnNames().indexOf("saldo_final",0)+1
	var idxMensaje 	= $ds_movim.getColumnNames().indexOf("mensaje",0)+1
	
	//Recorrida calculando el saldo, debito y credito segun corresponda	
	
	var $cli_ant 	= $ds_movim.getValue(1,1)
	var $cant_m 	= $ds_movim.getMaxRowIndex()
	var $saldo_ant	= 0
	//Para grabar el saldo final en la primera posicion del cliente
	var $pp			= 1
	
	for (var i = 1 ; i <= $cant_m ; i++)
	{
		if ($cli_ant != $ds_movim.getValue(i,1))
		{
			//Si el saldo del cliente es menor al minimo, lo borro del dataset
			if (Math.abs($saldo_ant) < fImpMin)
			{
				$ds_movim 	= borrarCliente($ds_movim,$cli_ant,i-1)
				i 			-= ($cant_m - $ds_movim.getMaxRowIndex())
				$cant_m 	= $ds_movim.getMaxRowIndex()
			}
			$ds_movim.setValue($pp,idxFinal,$saldo_ant)
			var $saldoH = saldoHistorico(serverName,$ds_movim.getValue($pp,1),fecha_hasta).toFixed(2) * 1
			var difSaldos = $saldo_ant - $saldoH
			if (Math.abs(difSaldos) > 0.005)
				$ds_movim.setValue($pp,idxMensaje,'Diferencia de Saldos: '+ utils.numberFormat(difSaldos,'###,##0.00') + ' Histórico: ' + utils.numberFormat($saldoH,'###,##0.00'))

			globals.gtotal_saldo += $saldo_ant
			$pp 		= i
			$cli_ant 	= $ds_movim.getValue(i,1)
			$saldo_ant 	= 0
		}
		var $imp = null
		if ($ds_movim.getValue(i,idxImporte) != null)
			$imp = $ds_movim.getValue(i,idxImporte).toFixed(2) * 1

		//Calculo saldo, se suma el importe antes de grabar
		$saldo_ant += $imp
		$ds_movim.setValue(i,idxSaldo,$saldo_ant)
		//Si importe_signo < 0 va al credito
		if ($imp > 0)
		{
			$ds_movim.setValue(i,idxCredito,$imp)
			$ds_movim.setValue(i,idxDebito,null)
		}
		else
		{
			$ds_movim.setValue(i,idxDebito,$imp*(-1))
			$ds_movim.setValue(i,idxCredito,null)
		}
	}
	$ds_movim.setValue($pp,idxFinal,$saldo_ant)
	globals.gtotal_saldo += $saldo_ant
	
	crearForm($ds_movim, 'resumen_gral_saldos_imp', 'saldos')
	
	/*var $params = {
		userv: uservs_to_uservs.razon_social,
		pTitulo: 'Resumen de Cuenta Desde '+ utils.dateFormat(globals.gFechaDesde,'dd-MM-yyyy') + ' Hasta '+ utils.dateFormat(globals.gFechaHasta,'dd-MM-yyyy'),
		pSaldoTotal: globals.gtotal_saldo
	}
	globals.metodoJasper('impresion','ventas/resumen_gral.jasper','Resumen_cuenta_clientes',$ds_movim,$params)*/
}

/**
 * @properties={typeid:24,uuid:"1A0744C2-0137-4803-BDED-4044FCF82F02"}
 */
function crearForm(dataset, nombreForm, tipo)
{
	var nombre = nombreForm +'_' + tipo
	history.removeForm(nombre)
	solutionModel.removeForm(nombre)

	var nombre_form = nombreForm//'resumen_gral_3'
	var frm = solutionModel.cloneForm(nombre,solutionModel.getForm(nombre_form))
							//   cliente_id,     ctacte_cl_id, razon_social ,   fecha   , comprob_completo,cc.saldo_signo
							//ctacte_cl_id      cliente_id,    razon_social,    fecha,             cod_mov,    comprob ,       importe_signo,     debito,       credito,          saldo		saldo_final
	var tipos = new Array (JSColumn.INTEGER,JSColumn.INTEGER,JSColumn.TEXT,JSColumn.DATETIME,JSColumn.INTEGER,JSColumn.TEXT,JSColumn.NUMBER,JSColumn.TEXT, JSColumn.NUMBER,JSColumn.NUMBER,JSColumn.NUMBER,JSColumn.NUMBER,JSColumn.TEXT)
	frm.dataSource = dataset.createDataSource(tipo+'_'+nombreForm,tipos)
	
	var sub = frm.getLeadingSubSummaryParts()
	sub[0].groupbyDataProviderIDs = 'razon_social'

	var trail = frm.getTrailingSubSummaryParts()
	trail[0].groupbyDataProviderIDs = 'razon_social'
	
	forms[frm.name].controller.sort('razon_social asc, cliente_id asc, fecha_mov asc, ctacte_cl_id asc')
	
	globals.metodoPdf(frm.name,'resumen_'+tipo+'_clientes_',true)
	return true
}

/**
 * Perform the element default action.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"DE228E02-A621-40F7-AA03-B8827D93E342"}
 */
function resumenCuenta(event) {
	resumenCuentaDs(globals.gClienteDesdeNombre,globals.gClienteHastaNombre, 'pdf')
}

/**
 * Perform the element default action.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"593E5490-9DDD-4BD3-BA40-263EE095B46E"}
 */
function resumenSaldos(event) {
	resumenSaldosDs(globals.gClienteDesdeNombre,globals.gClienteHastaNombre, 'pdf')
}

/**
 * @properties={typeid:24,uuid:"4C793F27-77BD-46EF-9736-C06DE208E5DA"}
 */
function saldoHistorico(dataSource,cliente,fHasta)
{
	var query = 'SELECT SUM(importe_signo) as "saldo_ant" FROM ctacte_cl as "cc" '+
				'where cc.cliente_id = ? and cc.fecha_mov < ? '+
				'group by cc.cliente_id'
	var args = [cliente,fHasta]
	var max = 1
	var $ds = databaseManager.getDataSetByQuery(dataSource,query,args,max)
	if ($ds.getMaxRowIndex() > 0)
		return $ds.getValue(1,1)
	return 0
}
